#include<bits/stdc++.h>

using namespace std;

using ll=long long;
#define endl '\n'
const int maxn = 4;
int n = 4, m = 4;

char G[maxn][maxn] = {
        'A', 'B', '/', 'D',
        'E', 'F', '/', 'H',
        'I', '/', 'K', 'L',
        'M', 'N', 'O', 'P',
};
int book[maxn][maxn];
int fx[4][2] = {{0,  1},
                {0,  -1},
                {1,  0},
                {-1, 0}};

void bfs(int x, int y) {//O(m*n)
    queue<pair<int, int>> Q;
    Q.push(make_pair(x, y));
    book[x][y] = 1;
    while (Q.size()) {
        auto pt = Q.front();
        int hx = pt.first;
        int hy = pt.second;
        cout << G[hx][hy];
        Q.pop();
        for (int i = 0; i < 4; i++) {
            int nx = hx + fx[i][0];
            int ny = hy + fx[i][1];
            if (nx < 0 || nx >= 4 || ny < 0 || ny >= 4 || G[nx][ny] == '/' || book[nx][ny])continue;
            Q.push(make_pair(nx, ny));
            book[nx][ny] = 1;
        }
    }
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int area = 0;
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 4; j++) {
            if (book[i][j] == 1 || G[i][j] == '/')continue;
            ++area;
            bfs(i, j);
        }
    cout << area << endl;
    return 0;
}
/**
这段代码是一个使用BFS算法遍历给定迷宫中所有连通块（由非障碍物组成的连通区域）的程序。

程序首先定义了一个4x4的字符型数组G，表示一个迷宫地图。其中'A'到'P'表示可达的路径，'/'表示障碍物。这个数组将用来记录迷宫地图并进行遍历。

接下来，定义了一个2维整型数组book和四个二元组fx，其中book用来记录每个坐标是否已经被遍历过，fx用来表示在搜索中每个节点的四个邻接节点。定义的队列Q用来在BFS搜索过程中存储从当前节点出发的所有未访问的可达节点。

然后进入main函数，使用双重for循环扫描整个G数组，对每个未被访问过的，不是障碍物的(G[i][j] != '/')点进行BFS遍历。通过遍历，可以访问到这个点所在的连通块中所有非障碍物点的坐标。

对于每个连通块，输出其中所有的字母，并记录连通块的数量（area），最后输出连通块的数量作为程序的结果。
 */